﻿// ===============================================================================
//  Copyright © NewSQL.CN. All rights reserved .
//  技术论坛：http://newsql.cn/
//  个人博客：http://www.ymind.net/
//  版权所有：NewSQL中文社区 彦铭工作室
// ===============================================================================

using System.Collections.Generic;
using System.Data;
using System.Runtime.InteropServices;
using Newsql.Data.RDBMS.Results;

namespace Newsql.Data.RDBMS
{
	/// <summary>
	/// 封装 <see cref="QueryBuilder&lt;T&gt;"/> 的扩展方法。
	/// </summary>
	[ComVisible(true)]
	public static class QueryBuilderExtensionMethods
	{
		/// <summary>
		/// 为查询添加一个 <see cref="System.Data.Common.DbParameter"/>。
		/// </summary>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="parameterName"><see cref="System.Data.Common.DbParameter"/> 的名称。默认值为空字符串 ("")。</param>
		/// <param name="parameterValue">一个 <see cref="System.Object"/>，它是该参数的值。默认值为 null。</param>
		/// <returns>返回 <see cref="QueryBuilder{T}"/> 的实例。</returns>
		public static QueryBuilder<StoredProcedure> AddParameter(this QueryBuilder<StoredProcedure> queryBuilder, string parameterName, object parameterValue)
		{
			queryBuilder.Query.AddParameter(parameterName, parameterValue);

			return queryBuilder;
		}

		/// <summary>
		/// 为查询添加一个 <see cref="OutputParameter"/>。
		/// </summary>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="parameterName"><see cref="OutputParameter"/> 的名称。默认值为空字符串 ("")。</param>
		/// <param name="parameterValue">一个 <see cref="System.Object"/>，它是该参数的值。默认值为 null。</param>
		/// <returns>返回 <see cref="QueryBuilder{T}"/> 的实例。</returns>
		public static QueryBuilder<StoredProcedure> AddOutParameter(this QueryBuilder<StoredProcedure> queryBuilder, string parameterName, object parameterValue)
		{
			queryBuilder.Query.AddOutputParameter(parameterName, parameterValue);

			return queryBuilder;
		}

		/// <summary>
		/// 为查询添加一个 Net.Htmlbird.oSo.Results.OutputParameter。
		/// </summary>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="parameterName"><see cref="OutputParameter"/> 的名称。默认值为空字符串 ("")。</param>
		/// <param name="parameterType"><see cref="System.Data.DbType"/> 值之一。默认值为 <see cref="System.Data.DbType.String"/>。</param>
		/// <returns>返回 <see cref="QueryBuilder{T}"/> 的实例。</returns>
		public static QueryBuilder<StoredProcedure> AddOutParameter(this QueryBuilder<StoredProcedure> queryBuilder, string parameterName, DbType parameterType)
		{
			queryBuilder.Query.AddOutputParameter(parameterName, parameterType);

			return queryBuilder;
		}

		/// <summary>
		/// 为查询添加一个 <see cref="OutputParameter"/>。
		/// </summary>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="parameterName"><see cref="System.Data.Common.DbParameter"/> 的名称。默认值为空字符串 ("")。</param>
		/// <param name="parameterValue">一个 <see cref="System.Object"/>，它是该参数的值。默认值为 null。</param>
		/// <param name="parameterType"><see cref="System.Data.DbType"/> 值之一。默认值为 <see cref="System.Data.DbType.String"/>。</param>
		/// <param name="size">列中数据的最大大小（以字节为单位）。默认值是从参数值推导出的。</param>
		/// <returns>返回 <see cref="QueryBuilder{T}"/> 的实例。</returns>
		public static QueryBuilder<StoredProcedure> AddOutParameter(this QueryBuilder<StoredProcedure> queryBuilder, string parameterName, object parameterValue, DbType parameterType, int size)
		{
			queryBuilder.Query.AddOutputParameter(parameterName, parameterValue, parameterType, size);

			return queryBuilder;
		}

		/// <summary>
		/// 对连接对象执行 SQL 语句。
		/// </summary>
		/// <typeparam name="T">指定要提取的对象的类型。</typeparam>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="obj">指定一个类型为 <see cref="StoredProcedure"/> 的对象的实例。</param>
		public static void Execute<T>(this QueryBuilder<StoredProcedure> queryBuilder, T obj) { queryBuilder.Query.Execute(obj); }

		/// <summary>
		/// 对连接对象执行 SQL 语句。
		/// </summary>
		/// <typeparam name="T">指定要提取的对象的类型。</typeparam>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="obj">指定一个类型为 <see cref="StoredProcedure"/> 的对象的实例。</param>
		/// <param name="outputParameters">在方法返回时包含输出参数的实例的集合。</param>
		public static void Execute<T>(this QueryBuilder<StoredProcedure> queryBuilder, T obj, out OutputParameterCollection outputParameters) { queryBuilder.Query.Execute(obj, out outputParameters); }

		/// <summary>
		/// 提取指定类型的查询结果。
		/// </summary>
		/// <typeparam name="T">指定要提取的对象的类型。</typeparam>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="outputParameters">在方法返回时包含输出参数的实例的集合。</param>
		/// <returns>返回指定类型的对象的实例。</returns>
		public static T Fetch<T>(this QueryBuilder<StoredProcedure> queryBuilder, out OutputParameterCollection outputParameters) { return queryBuilder.Query.Fetch<T>(out outputParameters); }

		/// <summary>
		/// 将查询结果提取到指定类型的泛型集合中。
		/// </summary>
		/// <typeparam name="T">指定集合中对象的类型。</typeparam>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="outputParameters">在方法返回时包含输出参数的实例的集合。</param>
		/// <returns>返回指定类型的对象的集合。</returns>
		public static List<T> FetchAll<T>(this QueryBuilder<StoredProcedure> queryBuilder, out OutputParameterCollection outputParameters) { return queryBuilder.Query.FetchAll<T>(out outputParameters); }

		/// <summary>
		/// 对连接对象执行 SQL 语句。
		/// </summary>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="outputParameters">在方法返回时包含输出参数的实例的集合。</param>
		public static void Execute(this QueryBuilder<StoredProcedure> queryBuilder, out OutputParameterCollection outputParameters) { queryBuilder.Query.Execute(out outputParameters); }

		/// <summary>
		/// 执行查询，并返回查询所返回的结果集中第一行的第一列。所有其他的列和行将被忽略。
		/// </summary>
		/// <typeparam name="T">指定要提取的对象的类型。</typeparam>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="outputParameters">在方法返回时包含输出参数的实例的集合。</param>
		/// <returns>返回指定类型的对象的实例。</returns>
		public static T ExecuteScalar<T>(this QueryBuilder<StoredProcedure> queryBuilder, out OutputParameterCollection outputParameters) { return queryBuilder.Query.ExecuteScalar<T>(out outputParameters); }

		/// <summary>
		/// 提取 <see cref="MultiResult"/> 的实例。
		/// </summary>
		/// <param name="queryBuilder"><see cref="QueryBuilder{T}"/>。</param>
		/// <param name="outputParameters">在方法返回时包含输出参数的实例的集合。</param>
		/// <returns>返回 <see cref="MultiResult"/> 的实例。</returns>
		public static MultiResult FetchMultiple(this QueryBuilder<StoredProcedure> queryBuilder, out OutputParameterCollection outputParameters) { return queryBuilder.Query.FetchMultiple(out outputParameters); }
	}
}
